package top.someapp.applib.json;

import androidx.annotation.NonNull;
import java.io.Reader;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author zwz
 * Created on 2020-06-16
 */
public interface JsonHelper {

    JsonHelper INSTANCE = new JsonHelperImpl();

    /**
     * 将json字符串转换为Map
     *
     * @param json 待转换的json字符串
     * @param <T> 期望的map的key的类型
     * @return Map对象
     */
    <T> Map<T, Object> toMap(@NonNull String json);

    /**
     * 从reader中读取json字符串转换为Map
     *
     * @param reader 包含json字符串的Reader对象
     * @param <T> 期望的map的key的类型
     * @return Map对象
     */
    <T> Map<T, Object> toMap(@NonNull Reader reader);

    /**
     * 将json字符串转换为List
     *
     * @param json 待转换的json字符串
     * @param <T> List对象中的元素类型
     * @return List对象
     */
    <T> List<T> toList(@NonNull String json);

    /**
     * 从reader中读取json字符串转换为List
     *
     * @param reader 包含json字符串的Reader对象
     * @param <T> List对象中的元素类型
     * @return List对象
     */
    <T> List<T> toList(@NonNull Reader reader);

    /**
     * 将json字符串转换为java对象
     *
     * @param json 待转换的json字符串
     * @param beanType java对象的类型
     * @param <T> java对象的类型
     * @return java对象
     */
    <T> T toBean(@NonNull String json, @NonNull Type beanType);

    /**
     * 将map转换为json字符串
     *
     * @param map 待转换的值
     * @return json字符串
     */
    String toJSONString(Map<String, Object> map);

    /**
     * 将list转换为json字符串
     *
     * @param list 待转换的值
     * @return json字符串
     */
    String toJSONString(Collection<?> list);

    /**
     * 将任意对象转换为json字符串
     *
     * @param obj 待转换的任意对象
     * @return json字符串
     */
    String toJSONString(Object obj);

    /**
     * 将任意对象转换为json字符串
     *
     * @param obj 待转换的任意对象
     * @param jsonIfNull obj为null时返回的json字符串
     * @param includeNulls JSONObject的value为null时，是否输出到json字符串中
     * @param jsNumberSafe 是否检查整形值(long)超过JavaScript safe number的范围
     * @return json字符串
     */
    String toJSONString(Object obj, String jsonIfNull, boolean includeNulls,
        boolean jsNumberSafe);

    /**
     * 将任意对象转换为尽可能短的json字符串，相当于：{@code toJSONString(obj, null, true, false}
     *
     * @param obj 待转换的任意对象
     * @return json字符串
     */
    String shortJSONString(Object obj);

    /**
     * 将任意对象转换为尽可能短的json字符串，检查long值是否超过JavaScript safe number的范围.<br>
     * 相当于：{@code toJSONString(obj, "", true, true}
     *
     * @param obj 待转换的任意对象
     * @return json字符串
     */
    String safeJSONString(Object obj);

}
